// import { login } from '@/api/user'
import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
// 引入持久化方法(存入本地Cookies)
import { login, getUserInfo, getUserDetailById } from '@/api/user'
// 引入登录请求,获取用户信息,获取员工信息

// 引入重置路由方法
import { resetRouter } from '@/router'

const state = {
  token: getToken(), // 设置token初始状态 token持久化=>放到缓存中
  // 初始化vuex时,就会从本地Cookies里获取数据
  userInfo: {} // 定义一个空对象 不是null 因为后边我要开发userInfo的属性给别人用 userInfo.name
}
// 修改状态
const mutations = {
  // 设置token
  setToken (state, token) {
    state.token = token // 设置token 只是修改state中的数据
    // 把从本地Cookies里获取的数据设置给token
    setToken(token)
    // 把token数据再存入Cookies里
    // 引入的jsCookie方法
  },
  // 删除缓存
  removeToken (state) {
    state.token = null // 删除vuex的token
    // 数据缓存
    removeToken()
    // 把本地Cokie销毁
  },
  // 设置用户信息
  setUserInfo (state, result) {
    // 设置用户信息
    state.userInfo = result
    // 这里的result也需要是一个对象,才能做到数据变化,页面跟着变化
  },
  removeUserInfo (state) {
    // 删除用户信息
    state.userInfo = {}
    // 删除userInfo里的数据
  }
}
// 执行异步
const actions = {
  // 定义login action 也需要参数 调用action时，传递过来的参数
  async login (context, data) {
    const result = await login(data)
    // 调用api/user里的接口,这里返回的数据已经被utils/request处理过了,返回的result直接就是具体数据
    // data是输入的账号密码，login是api的方法，返回一个token
    // 实际上就是一个promise  result就是执行的结果
    // axios默认给数据加了一层data
    // 表示登录接口调用成功 也就四意味着你的用户名和密码是正确的
    // actions 修改 state 必须通过mutations
    context.commit('setToken', result)
    // context相当于this.$store,result服务器发送回来的数据
    // 调用mutations方法的写入cookie,把从服务器获取回来的用户token写入cookie,同时修改本地state.token数据
    // 写入时间戳
    setTimeStamp() // 将当前的最新时间写入缓存
  },
  async getUserInfo (context) {
    // 获取用户信息
    const result = await getUserInfo() // 获取返回值
    // 调用api/user里的接口,获取用户信息,这里返回的数据已经被utils/request处理过,这里返回的result就是具体数据
    const baseInfo = await getUserDetailById(result.userId) // 为了获取头像
    // 调用api/user里的接口
    const baseResult = { ...result, ...baseInfo } // 将两个接口结果合并
    context.commit('setUserInfo', baseResult) // 将整个的个人信息设置到用户的vuex数据中 提交mutations
    // 把获取的用户具体信息更新到vuex本地,使用户个人信息里有头像与其基本信息
    return result // 这里为什么要返回
    // 做权限的时候会使用
  },
  // 登出的action
  async logout (context) {
    // 删除token,退出登录操作
    context.commit('removeToken') // 不仅删除了vuex中的 还删了缓存中的
    context.commit('removeUserInfo') // 删除用户信息
    resetRouter() // 重置路由 调用router/index.js 中的重置路由方法
    // 去设置权限模块下路由为初始状态
    // 问： vuex子模块怎么调用子模块的action ？
    // 答： 都没加锁的情况下 可以随意调用
    // 因为 不加命名空间的情况下 所有的mutations和action都是挂在全局上的 所以可以直接调用
    // 问： 加了命名空间的子模块 怎么调用另一个加了命名空间的子模块的mutations
    // 答： 加了命名空间的context指的不是全局的context
    /* mutations三个参数的含义：
      第一个参数： mutations的名称
      第二个参数： 载荷 payload
      第三个参数： { root: true } 调用根级的mutations或者action
    */
    context.commit('permission/setRoutes', [], { root: true }) // 调用permission中的mutations中的setRoutes方法 加了命名空间的子模块调用 必须加{ root: true } 并且添加模块路径
    // 重置多页签
    context.dispatch('tagsView/delAllViews', null, { root: true })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
